Skip to main content

SPEEX 录⾳+控制器回读模式回声消除

⼀ 配置

1.1 勾选speexdsp

1

1.2 勾选 libmedia 中相应的算法功能以及测试⽤例

对应代码在⼯程⽬录中的 libmedia/test/main_noecho_test.c

2

3

1.3 播放、录⾳与回读功能

声卡驱动配置

4

开启偏置电压:外接amic时⽤于给⻨克⻛供电, 不同型号的⻨克⻛需要不同的偏值电压值(设置偏值电压的寄存器数值)

mic信号的增益(MICL_GAIN):外接amic时需要依据信号强弱设置改增益⼤⼩

⼿动设置ALCL增益(ALCL_GAIN):alcl为codec的adc的数字增益,⽤于调节录制⾳频的增益⼤⼩

输出信号的模拟增益(HPOUTL):⽤于调节播放⾳频的增益⼤⼩

创建声卡设备

5

# ls /dev/snd/
controlC0 controlC1 pcmC0D0c pcmC0D0p pcmC1D0c timer
//pcmC0D0c对应amic设备,pcmC0D0p为播放设备,pcmC1D0c为回读设备

二 验证

开启 third_party/speexdsp/src/config.h 中的 DUMP_ECHO_CANCEL_DATA 宏, 指定⾳频数据⽂件保存的位置, third_party/speexdsp/src/mdf.c

6

# aec_aic_loopback_test 20 /usr/data/noecho.pcm &              //20为录制时长(s),noecho.pcm为经过消除回声后文件
# aplay -Dplughw:0,0 /usr/data/crazy_8k_60.wav & //播放音乐

格式见demo,libmedia/test/main_noecho_test.c,此为原始数据

8

使用Audacity打开tmp目录下保存的文件, 查看消回声效果

7

aec_out.sw: 经过消回声波形

aec_play.sw: 播放音乐波形

aec_rec.sw: 未经过消回声的录音波形

三 算法要求

算法需要满⾜

  1. 给算法的⾳频帧尽量保证在幅值的60%到80%之间
  2. 录制及播放的⾳频均不能消顶

可以通过 cmd_alsa(libhardware2中的⼯具)修改mic及speak音量大小

9

# cmd_alsa list_ctls card=hw:0
integer: "Master Playback Volume" [0, 255] 220 //speak大小
integer: "Mic Volume" [0, 255] 225 //mic大小
integer: "ADCL Volume" [0, 255] 225
other[1]: "Playback Mute"
integer: "AGC OBSERVE Gain" [0, 31] 31
integer: "AGC PGAIN MAX Volume" [0, 7] 7
integer: "AGC PGAIN MIN Volume" [0, 7] 0
integer: "AGC RANGE MAX Threshold" [0, 32767] 16422
integer: "AGC RANGE MIN Threshold" [0, 32767] 8294
other[1]: "AGC Switch"
integer: "ALCL Volume" [0, 31] 6
integer: "DACL Volume" [0, 255] 220
integer: "HPOUTL Volume" [0, 4] 0
integer: "MICL Volume" [0, 3] 3

example:
cmd_alsa set_ctl card=hw:0 ctl="Master Playback Volume" value=230